package br.com.esrestaurante.faces;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.esrestaurante.dao.AberturaDAO;
import br.com.esrestaurante.dao.ContaDAO;
import br.com.esrestaurante.dao.MesaDAO;
import br.com.esrestaurante.entidades.Abertura;
import br.com.esrestaurante.entidades.Conta;
import br.com.esrestaurante.entidades.Mesa;
import br.com.esrestaurante.entidades.MesaVO;
import br.com.esrestaurante.entidades.Usuario;
import br.com.esrestaurante.tipos.TipoPerfilUsuario;

public class FecharMesaFaces extends Faces implements Serializable {

	private static final long serialVersionUID = 1L;

	private final String titulo = "Fechar Mesa";

	private List<MesaVO> listaMesasOcupada;

	private MesaVO mesaSelecionada;

	private Abertura aberturaSelecionada;

	private Usuario clienteSelecionado;
	
	private boolean exibeVoltar;

	public FecharMesaFaces() throws IOException {

		if (TipoPerfilUsuario.CLIENTE.equals(usuarioWB.getPerfil())) {

			clienteSelecionado = usuarioWB;

			aberturaSelecionada = new AberturaDAO()
					.recuperarUltimaAberturasClietne(clienteSelecionado);

			mesaSelecionada = new MesaVO(aberturaSelecionada.getMesa());
			
			exibeVoltar = false;
		}else {
			
			List<Mesa> listaMesas = new MesaDAO().listarMesasOcupadas();
			listaMesasOcupada = new ArrayList<MesaVO>();

			for (Mesa mesa : listaMesas) {
				listaMesasOcupada.add(new MesaVO(mesa));
			}
		}
	}

	public String selecionarMesaAction() {
		if (mesaSelecionada != null) {
			clienteSelecionado = mesaSelecionada.getCliente();
			aberturaSelecionada = new AberturaDAO().recuperarUltimaAberturasClietne(clienteSelecionado);
			exibeVoltar = true;
		}
		return "";
	}

	public String selecionarClienteAction() {
		return "";
	}

	public String fecharMesaAction() {

		if (possueContaAberta()) {

			adicionarMsgErro(
					"Conta Aberta",
					"A Mesa possui uma conta aberta, favor encerrar a Conta antes de tentar fechar essa Mesa");
			clienteSelecionado = null;

		} else {

			aberturaSelecionada.setDataFechamento(Calendar.getInstance());

			new AberturaDAO().merge(aberturaSelecionada);
			return getStringRetorno();
		}
		return null;
	}

	private boolean possueContaAberta() {

		Abertura abertura = new AberturaDAO()
				.recuperarUltimaAberturasClietne(clienteSelecionado);		

		Conta conta = new ContaDAO().recuperarContaPorAbertura(abertura);

		if (conta == null || conta.getDataEncerramento() != null) {

			return false;
		}
		return true;
	}

	public String voltarAction() {

		clienteSelecionado = null;
		aberturaSelecionada = null;
		mesaSelecionada = null;
		exibeVoltar = false;
		return null;
	}
	
	public String cancelarAction() {
		
		return getStringRetorno();
	}

	public Usuario getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Usuario clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public MesaVO getMesaSelecionada() {
		return mesaSelecionada;
	}

	public void setMesaSelecionada(MesaVO mesaSelecionada) {
		this.mesaSelecionada = mesaSelecionada;
	}

	public String getTitulo() {
		return titulo;
	}

	public List<MesaVO> getListaMesasOcupada() {
		return listaMesasOcupada;
	}

	public void setListaMesasOcupada(List<MesaVO> listaMesasOcupada) {
		this.listaMesasOcupada = listaMesasOcupada;
	}

	public Abertura getAberturaSelecionada() {
		return aberturaSelecionada;
	}

	public void setAberturaSelecionada(Abertura aberturaSelecionada) {
		this.aberturaSelecionada = aberturaSelecionada;
	}

	public boolean isExibeVoltar() {
		return exibeVoltar;
	}

	public void setExibeVoltar(boolean exibeVoltar) {
		this.exibeVoltar = exibeVoltar;
	}
	
}
